{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-10-31T08:20:34.850724Z",
     "start_time": "2025-10-31T08:20:34.832760Z"
    }
   },
   "source": [
    "from langgraph.graph import StateGraph, END\n",
    "from typing import TypedDict\n",
    "import ollama\n",
    "from langchain_core.messages import SystemMessage\n",
    "\n",
    "from juputer_constants import OLLAMA_DEFAULT_MODEL\n",
    "\n",
    "\n",
    "# 定义状态结构\n",
    "class GraphState(TypedDict):\n",
    "    question: str\n",
    "    answer: str\n",
    "\n",
    "\n",
    "# 定义系统prompt\n",
    "SYSTEM_PROMPT = \"\"\"你是一个智能助手，请根据用户的问题提供准确、简洁的回答。\n",
    "请遵循以下规则：\n",
    "1. 回答要直接针对用户的问题\n",
    "2. 保持礼貌和专业\n",
    "3. 如果不确定答案，请说明不确定\n",
    "4. 不要添加与问题无关的信息\n",
    "/nothink\n",
    "\"\"\"\n",
    "\n",
    "\n",
    "# 节点 1：预处理输入\n",
    "def preprocess_input(state: GraphState):\n",
    "    print(\"[Preprocessor] 正在预处理输入...\")\n",
    "    # 使用SystemMessage封装系统提示\n",
    "    full_question = f\"{SYSTEM_PROMPT}\\n\\n用户问题：{state['question'].strip()}\"\n",
    "    state['question'] = full_question\n",
    "    return state\n",
    "\n",
    "\n",
    "# 节点 2：调用 Ollama 流式生成回答\n",
    "def generate_streaming_answer(state: GraphState):\n",
    "    print(\"[Generator] 正在流式生成回答...\")\n",
    "\n",
    "    response_stream = ollama.generate(\n",
    "        model=OLLAMA_DEFAULT_MODEL,\n",
    "        prompt=state['question'],\n",
    "        stream=True\n",
    "    )\n",
    "\n",
    "    buffer = \"\"\n",
    "    for chunk in response_stream:\n",
    "        content = chunk.get('response', '')\n",
    "        if content:\n",
    "            buffer += content\n",
    "            print(content, end=\"\", flush=True)  # ✅ 使用 flush 实现流式输出\n",
    "\n",
    "    state['answer'] = buffer\n",
    "    return state\n",
    "\n",
    "\n",
    "# 节点 3：输出结果\n",
    "def postprocess_output(state: GraphState):\n",
    "    print(\"[Post Processor] 正在输出结果...\")\n",
    "    print(f\"问题：{state['question']}\")\n",
    "    print(f\"答案：{state['answer']}\")\n",
    "\n",
    "\n",
    "# 构建状态机\n",
    "workflow = StateGraph(GraphState)\n",
    "\n",
    "# 添加节点\n",
    "workflow.add_node(\"preprocess_input\", preprocess_input)\n",
    "workflow.add_node(\"generate_streaming_answer\", generate_streaming_answer)\n",
    "workflow.add_node(\"postprocess_output\", postprocess_output)\n",
    "\n",
    "# 设置执行顺序\n",
    "workflow.set_entry_point(\"preprocess_input\")\n",
    "workflow.add_edge(\"preprocess_input\", \"generate_streaming_answer\")\n",
    "workflow.add_edge(\"generate_streaming_answer\", \"postprocess_output\")\n",
    "workflow.add_edge(\"postprocess_output\", END)\n",
    "\n",
    "# 编译图\n",
    "app = workflow.compile()\n",
    "app.get_graph().print_ascii()"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "        +-----------+          \r\n",
      "        | __start__ |          \r\n",
      "        +-----------+          \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "    +------------------+       \r\n",
      "    | preprocess_input |       \r\n",
      "    +------------------+       \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "+---------------------------+  \r\n",
      "| generate_streaming_answer |  \r\n",
      "+---------------------------+  \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "    +--------------------+     \r\n",
      "    | postprocess_output |     \r\n",
      "    +--------------------+     \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "              *                \r\n",
      "         +---------+           \r\n",
      "         | __end__ |           \r\n",
      "         +---------+           \n"
     ]
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-31T08:20:35.905344Z",
     "start_time": "2025-10-31T08:20:34.858722Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from IPython.display import Image, display\n",
    "\n",
    "display(Image(app.get_graph().draw_mermaid_png(max_retries=5)))"
   ],
   "id": "17b4744c17818fbe",
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-31T08:20:39.122652Z",
     "start_time": "2025-10-31T08:20:35.923345Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 运行流程（传入初始状态）\n",
    "question = {\"question\": \"1+1=？\"}\n",
    "\n",
    "app.invoke(question)"
   ],
   "id": "5b7c4bd4caf89e12",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Preprocessor] 正在预处理输入...\n",
      "[Generator] 正在流式生成回答...\n",
      "<think>\n",
      "\n",
      "</think>\n",
      "\n",
      "1+1=2。[Post Processor] 正在输出结果...\n",
      "问题：你是一个智能助手，请根据用户的问题提供准确、简洁的回答。\n",
      "请遵循以下规则：\n",
      "1. 回答要直接针对用户的问题\n",
      "2. 保持礼貌和专业\n",
      "3. 如果不确定答案，请说明不确定\n",
      "4. 不要添加与问题无关的信息\n",
      "/nothink\n",
      "\n",
      "\n",
      "用户问题：1+1=？\n",
      "答案：<think>\n",
      "\n",
      "</think>\n",
      "\n",
      "1+1=2。\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'question': '你是一个智能助手，请根据用户的问题提供准确、简洁的回答。\\n请遵循以下规则：\\n1. 回答要直接针对用户的问题\\n2. 保持礼貌和专业\\n3. 如果不确定答案，请说明不确定\\n4. 不要添加与问题无关的信息\\n/nothink\\n\\n\\n用户问题：1+1=？',\n",
       " 'answer': '<think>\\n\\n</think>\\n\\n1+1=2。'}"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
